import CryptoJS from 'crypto-js';

/** AES 加解密工具类，支持通过参数传递密钥和初始向量 */
class AESUtil {
	/** 默认加密密钥（如未传递则使用此密钥） */
	private static readonly DEFAULT_SECRET_KEY = 'h-news-default-key-123';
	/** 当前全局加密密钥（可通过 setSecretKey 动态设置） */
	private static secretKey: string | undefined;
	/**
	 * 设置全局加密密钥
	 *
	 * @param secretKey 新的密钥字符串
	 */
	public static setSecretKey(secretKey: string): void {
		AESUtil.secretKey = secretKey;
	}
	/**
	 * 加密字符串数据
	 *
	 * @param data 需要加密的字符串
	 * @param secretKey 加密密钥（可选，未传递则使用默认密钥）
	 * @param iv 初始向量（可选，默认自动生成）
	 * @returns 加密后的字符串
	 */
	static encrypt(data: string, secretKey?: string, iv?: CryptoJS.lib.WordArray): string {
		try {
			const usedKey = secretKey ?? AESUtil.secretKey ?? AESUtil.DEFAULT_SECRET_KEY;
			const usedIv = iv ?? CryptoJS.lib.WordArray.random(16);
			const encrypted = CryptoJS.AES.encrypt(data, usedKey, { iv: usedIv });
			// 返回 IV + 加密内容，便于解密时还原
			return `${usedIv.toString(CryptoJS.enc.Hex)}:${encrypted.toString()}`;
		} catch (error) {
			console.error('AES encryption failed:', error);
			return '';
		}
	}
	/**
	 * 解密字符串数据
	 *
	 * @param encryptedData 加密后的字符串（格式：iv:密文）
	 * @param secretKey 解密密钥（可选，未传递则使用默认密钥）
	 * @returns 解密后的原始字符串
	 */
	static decrypt(encryptedData: string, secretKey?: string): string {
		try {
			const [ivHex, cipherText] = encryptedData.split(':');
			if (!ivHex || !cipherText) return '';
			const iv = CryptoJS.enc.Hex.parse(ivHex);
			const usedKey = secretKey ?? AESUtil.secretKey ?? AESUtil.DEFAULT_SECRET_KEY;
			const bytes = CryptoJS.AES.decrypt(cipherText, usedKey, { iv });
			return bytes.toString(CryptoJS.enc.Utf8);
		} catch (error) {
			console.error('AES decryption failed:', error);
			return '';
		}
	}
}

export default AESUtil;
